package com.erp.erp_servers.warehouse;

import com.erp.erp_entitys.warehouse.entity.PlanInstoreProductEntity;
import com.erp.erp_entitys.warehouse.entity.StockEntity;
import com.erp.erp_entitys.warehouse.req.*;
import com.erp.erp_entitys.warehouse.rsp.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @ClassName : IStockService
 * @Description : 库存表接口
 * @Author : lst
 * @Date: 2020-07-15 08:15
 */
public interface IStockService {

    /**
     * 获取库存信息
     * @param req 查询参数
     * @return 库存集合
     */
    List<StockEntity> queryAll(StockEntity req);


    /**
     * 新增数据
     *
     * @param stock 实例对象
     * @return 影响行数
     */
    int insert(StockEntity stock);


    /**
     * 查询库存集合
     * @param req 查询参数
     * @return 库存集合
     */
    List<StockEntity> getStockList(StockReq req);

    /**
     * 查询库存账龄集合
     * @param req 查询参数
     * @return 库存集合
     */
    List<StockEntity> getStockAccountAgeList(StockAccountAgeReq req);

    /**
     * 获取库存信息
     * @param req 查询条件
     * @return 库存集合
     */
    List<StockEntity> getStockListByQuery(SelectStockReq req);

    /**
     * 通过id获取库存对象
     * @param id 库存id
     * @return 库存对象
     */
    StockEntity getStockById(Integer id);

    /**
     * 修改数据
     *
     * @param stock 实例对象
     * @return 影响行数
     */
    int update(StockEntity stock);

    /**
     * 修改数据
     *
     * @param stock 实例对象
     * @return 影响行数
     */
    int updateStockInfo(StockEntity stock);

    /**
     * 通过库存对象获取库存信息集合
     * @param req 库存对象
     * @return 库存对象集合
     */
    List<StockEntity> getStockListByStock(StockEntity req);

    /**
     * 获取库存产品集合
     * @param req 查询入参
     * @return 库存集合
     */
    List<StockEntity> getStockProductList(QueryStockProductReq req);

    /**
     * 获取同一批库存数据（批次号，产品编码  规格编码，仓库id  合同号 如果都相同 则为同一组）
     * @param req 查询条件
     * @return 查询结果
     */
    List<StockEntity> getTheSameStockInfo(StockEntity req);

    /**
     * 更新库存、调拨、销售出库明细的各种费用信息
     * 海运费、运输代理费、美国仓储操作费、关税、分摊费用单价
     * @param inStoreProduct 备货入库产品信息
     */
    void updateStockAndTransferAndSaleFee(PlanInstoreProductEntity inStoreProduct);



    // ************************************外销合同*******************************************

    /**
     * 通过条件查询
     *
     * @param req 条件对象
     * @return 对象列表
     */
    List<ContractInfoRsp> getContractAndStockInfo(ContractInfoReq req);


    /**
     * 通过实体作为筛选条件查询
     *
     * @param id 销售主表id
     * @return 对象列表
     */
    List<ImportContractInfoRsp> getContractProductInfo(Integer id);


    /**
     * 根据销售合同id集合获取库存集合信息
     * @param ids 销售id集合
     * @return 库存集合信息
     */
    List<ImportContractInfoRsp> getStockListByContractIds(@Param("ids") List<Integer> ids);




    //************************************仓库字典*************************************************

    /**
     * 获取所有字典信息
     * @param req 查询参数
     * @return 字典信息
     */
    List<DictionaryInfoRsp> getDictionaryInfo(DictionaryInfoReq req);





    //*************************************************产品信息******************************************************

    /**
     * 获取产品信息
     * @param req 查询入参实体
     * @return 查询结果
     */
    List<ProductInfoRsp> getProductInfoByQuery(ProductInfoReq req);

    /**
     * 获取产品信息
     * @param req 查询入参实体
     * @return 查询结果
     */
    List<ProductInfoRsp> getProductInfoByConcat(ProductInfoReq req);

    /**
     * 根据产品编码规格编码获取规格信息
     * @param productCode 产品编码
     * @param specificationCode 规格编码
     * @return 规格信息
     */
    ProductInfoRsp getProductInfoByCode(String productCode, String specificationCode);

    /**
     * 获取产品配件信息
     * @param req 查询入参实体
     * @return 规格配件信息
     */
    List<ProductInfoRsp> getSpecPartsInfoByConcat(ProductInfoReq req);


    /**
     * 根据产品规格编码获取对应配件信息
     * @param code 产品规格编码
     * @param productCode 产品编码
     * @return 配件信息
     */
    List<ProductPartsInfoRsp> getProductPartsInfoBySpecNo(@Param("code") String code, @Param("productCode") String productCode);

    /**
     * 根据产品规格编码获取对应附件信息
     * @param productCode 产品编码
     * @return 对应附件信息
     */
    List<ProductAnnexInfoRsp> getProductAnnexInfoByProductCode(@Param("productCode") String productCode);



    //*************************************************公司信息******************************************************

    /**
     * 获取公司信息
     * @return 公司信息
     */
    List<CompanyInfoRsp> getCompanyInfo();



    //*************************************************银行信息******************************************************

    /**
     * 获取银行信息通过公司编码
     * @param code 公司编码
     * @return  银行信息
     */
    List<BankAccountRsp> getBankInfo(String code);





    //*************************************************银行信息******************************************************

    /**
     * 获取部门信息通过公司编码
     * @param code 公司编码
     * @return  部门信息
     */
    List<DepartmentInfoRsp> getDepartmentInfo(@Param("code") String code);


    /**
     * 根据产品编码查询库存中的产品个数,且每款产品实际数量大于0
     * @param productCode
     * @return
     */
    Integer getStockProduct(String productCode);
}
